#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <functional>
#include <vector>

using namespace std;

void handler(int signum)
{
    sleep(1);
    cout << "收到了一个信号: " << signum << endl;
}

int main()
{
    // signal(SIGFPE, handler);
     signal(SIGSEGV, handler);
    // int a = 100;
    // a /= 0;
    // while(1)  sleep(1);

    int* p = nullptr;
    *p = 0;

    return 0;
}

// unsigned int count = 0;
// typedef function<void ()> func;
// vector<func> callBacks;

// void showCount()
// {
//     // cout << "进程捕捉到了一个信号，正在处理中： " << signum << " Pid: " << getpid() << endl;
//     cout << "count:" << count << endl;
// }
// void showLog()
// {
//     cout << "这个是日志功能" << endl;
// }
// void logUser()
// {
//     if(fork() == 0)
//     {
//         execl("/usr/bin/who", "who", nullptr);
//         exit(1);
//     }
//     wait(nullptr);
// }


// void catchSignal(int signal) 
// {
//     for(auto &func : callBacks)
//     {
//         func();
//     }
//     cout << "-------------------" << endl;
//     alarm(1);
// }

// int main()
// {
//     signal(SIGALRM, catchSignal);
//     alarm(1);

//     callBacks.push_back(showCount);
//     callBacks.push_back(showLog);
//     callBacks.push_back(logUser);

//     while(true)  ++count;

//     return 0;
// }


// 验证读关写继续写的情况,OS给写端进程发送SIGPIPE信息的情况
// int main()
// {
//     // 1. 创建匿名管道
//     int pipefd[2] = {0};
//     int n = pipe(pipefd);
//     assert(n != -1);
//     (void)n;
//     cout << "创建匿名管道成功" << endl;

//     // 创建子进程
//     int id = fork();
//     if(id == 0)
//     {
//         // 子进程
//         // 关闭子进程的读端
//         close(pipefd[0]);
//         char send_buffer[128] = {'\0'};
//         string s = "我是子进程,我正在给你发消息";
//         int count = 0;
//         while(1)
//         {
//             // 构造变化的字符串
//             snprintf(send_buffer, sizeof(send_buffer), "%s id:%d %d", s.c_str(), getpid(), count++);
//             write(pipefd[1], send_buffer, strlen(send_buffer));
//             sleep(1);
//         }
//     }

//     // 父进程
//     // 关闭父进程的写端
//     close(pipefd[1]);
//     char read_buffer[128] = {'\0'};
//     int count = 0;
//     while(1)
//     {
//         ssize_t s = read(pipefd[0], read_buffer, sizeof(read_buffer) - 1);
//         if(s > 0)
//         {
//             read_buffer[s] = '\0';
//             ++count;
//             cout << "父进程:" << getpid() << " 收到消息" << read_buffer << endl;
//         }
//         else
//         {
//             cout << "写端已经关闭,读取结束" << endl;
//             break;
//         }
//         // 循环5次,关闭读端
//         if(count == 5)
//         {
//             close(pipefd[0]);
//             cout << "父进程的读端已关闭！" << endl;
//             break;
//         }
//     }
//     int status = 0;
//     int ret = waitpid(id, &status, 0);
//     assert(ret != -1);
//     cout << "等待子进程成功 " << "子进程id:" << id << " signal:" << (status & 0x7F) << endl;  

//     return 0;
// }



// #include <iostream>
// #include <signal.h>
// #include <unistd.h>
// #include <sys/wait.h>
// #include <cassert>
// #include <sys/types.h>
// #include <cstring>
// #include <stdlib.h>

// using namespace std;



// int main()
// {
//     cout << "我正在运行中..." << endl;
//     sleep(2);
//     abort();

//     return 0;
// }

// static void Usage(string proc)
// {
//     cout << "Usage:\r\n\t" << proc << " -SignalNumber ProcessID" << endl;
// }


// // 通过系统调用向进程发送信号(设计mykill命令)
// // ./mykill -2 pid
// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }

//     int signal = atoi(argv[1] + 1);
//     int id = atoi(argv[2]);

//     kill(id, signal);

//     return 0;
// }


// 验证进程等待中的core dump标记位
// int main()
// {
//     int id = fork();
//     // 子进程
//     if(id == 0)
//     {
//         cout << getpid() << endl;
//         sleep(100);
//         int a = 100;
//         a /= 0;

//         exit(0);
//     }

//     int status = 0;
//     int ret = waitpid(id, &status, 0);
//     assert(ret != -1);
//     (void)ret;
//     cout << "父进程: " << getpid() << " 子进程: " << id << " exit signal: " \
//     << (status & 0x7F) << " is core: " << ((status >> 7) & 1) << endl;
//     // 父进程
//     return 0;
// }


// void catchSignal(int signal) 
// {
//     cout << "捕捉到了一个信号: " << signal << endl;
// }


// 通过自定义捕捉验证Ctrl+C发生的是2号信号
// int main()
// {
//     // signal(2, catchSignal);
//     // catchSignal是自定义捕捉
//     signal(SIGINT, catchSignal);    
//     while(true)
//     {
//         cout << "我是一个进程,我的pid是: " << getpid() << endl;
//         sleep(2);

//         int a = 100;
//         a /= 0;

//         cout << "run here...." << endl;
//     }

//     return 0;
// }